package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)

// import (
// 	"fmt"
// 	"math/rand"
// 	"time"
// )

// 并发与并行
// 并发：同一时间段执行多个任务  通过goroutine实现，属于用户态额线程 由运行时（runtime）调度完成
// 并行: 同一时刻执行多个任务
// 启动goroutine
// func hello(i int){
// 	fmt.Println("hello",i)
// }
// // 程序启动之后会创建一个主goroute去执行
// func main(){
// 	for i:=0; i<10; i++ {
// 	// go hello(i) //开启一个单独的goroutine去执行hello函数(任务)
// 	go func(i int){
// 		fmt.Println(i)
// 	}(i)
// 	}
// 	fmt.Println("main")
// 	time.Sleep(time.Second)
// 	// main函数结束了,由main函数启动的子goroutine也都结束了
// }
// goroutine什么时候结束?
// goroutine对应的函数结束了,goroutine也就结束了
// main函数执行完了,由main函数创建的那些goroutine都结束了

// 结束goroutine
// func f(){
// 	rand.Seed(time.Now().UnixNano()) //保证每次执行的时候都有点不一样
// 	for i:=0;i<5;i++{
// 	r1:=rand.Int()
// 	r2:=rand.Intn(10) //0<=x<10
// 	fmt.Println(r1,r2)
// 	}
// }
var wg sync.WaitGroup

func f1(i int) {
	defer wg.Done() //通知wg把计数器减1，等减为0的时候，才会执行wg.Wait()
	time.Sleep(time.Millisecond * time.Duration(rand.Intn(10)))
	fmt.Println(i)
}
func main() {
	// f()
	for i := 0; i < 10; i++ {
		wg.Add(1) //计数牌加1（通俗理解: 派出几个小弟去干活）
		go f1(i)
	}
	wg.Wait() // Wait 等待wg的计数器减为0 （阻塞，等所有的子gorouting执行完成后再结束）
}
